package pe.edu.unmsm.fisi.sysllabus.presentacion.controller.mantenimiento;

import java.util.List;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.primefaces.event.SelectEvent;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import pe.edu.unmsm.fisi.sysllabus.negocio.modelo.dto.CarreraProfesionalDTO;
import pe.edu.unmsm.fisi.sysllabus.negocio.modelo.dto.CursoDTO;
import pe.edu.unmsm.fisi.sysllabus.negocio.modelo.dto.PlanEstPeriodoAcademicoDTO;
import pe.edu.unmsm.fisi.sysllabus.negocio.modelo.dto.PlanEstudioDTO;
import pe.edu.unmsm.fisi.sysllabus.negocio.modelo.dto.SyllabusxSemanaDTO;
import pe.edu.unmsm.fisi.sysllabus.negocio.servicio.CarreraService;
import pe.edu.unmsm.fisi.sysllabus.negocio.servicio.CursoService;
import pe.edu.unmsm.fisi.sysllabus.negocio.servicio.PlanEstPeriodoAcademicoService;
import pe.edu.unmsm.fisi.sysllabus.negocio.servicio.PlanEstudioService;
import pe.edu.unmsm.fisi.sysllabus.negocio.servicio.SyllabusService;

@Controller
@Scope("view")
public class ManteCarreraController {
	
	/****************ATRIBUTOS***************/
	private List<CarreraProfesionalDTO> listCarreras;
	private Integer indiceTab;
	private CarreraProfesionalDTO carreraElegida;
	private CarreraProfesionalDTO carreraEditar;
	private PlanEstudioDTO planesEstudioElegido;
	private PlanEstudioDTO planEstudioEditar;
	private PlanEstPeriodoAcademicoDTO periodoAcadxPlanElegido;
	private PlanEstPeriodoAcademicoDTO periodoAcadxPlanEditar;
	private CursoDTO cursoElegido;
	private CursoDTO cursoEditar;
	private SyllabusxSemanaDTO syllabusElegido;
	private SyllabusxSemanaDTO syllabusEditar;
	
	@Resource
	CarreraService carreraServ;
	
	@Resource
	PlanEstudioService planservice;
	
	@Resource
	PlanEstPeriodoAcademicoService perAcadPlanService;
	
	@Resource
	CursoService cursoService;
	
	@Resource
	SyllabusService syllabusService;
	
	/**************INICIALIZACION*************************/
	
	@PostConstruct
	private void inicializacion(){
		setListCarreras(carreraServ.listarCarreras());
		setIndiceTab(0);
		setCarreraEditar(new CarreraProfesionalDTO());
		setPlanEstudioEditar(new PlanEstudioDTO());
		setPeriodoAcadxPlanEditar(new PlanEstPeriodoAcademicoDTO());
		setCursoEditar(new CursoDTO());
		setSyllabusEditar(new SyllabusxSemanaDTO());
	}
	/****************NAVEGACION*******************/
	
	public void editarCarreraElegida(SelectEvent sEv){
		
		setCarreraEditar(carreraServ.obtenerCarrera(getCarreraElegida().getIdCarreraProf()));
		System.out.println("carrera elegida nombre:"+getCarreraEditar().getNomCarreraProf());
		setIndiceTab(1);
	}
	public void limpiarCarreraProf(ActionEvent ev){
		setCarreraEditar(new CarreraProfesionalDTO());
	}
	public void guardarCarreraProf(ActionEvent ev){
		carreraServ.guardarCarreraProfesional(carreraEditar);
		setListCarreras(carreraServ.listarCarreras());
		setCarreraEditar(new CarreraProfesionalDTO());
	}
	
	
	public void nuevoPlan(ActionEvent ev){
		setPlanEstudioEditar(new PlanEstudioDTO());
		getPlanEstudioEditar().setIdCarreraProfesional(getCarreraEditar().getIdCarreraProf());
	}
	public void guardarPlanEstudio(ActionEvent ev){
        FacesContext context = FacesContext.getCurrentInstance();  
		if (getPlanEstudioEditar().getIdCarreraProfesional()!=null) {
			planservice.guardarPlanEstudio(getPlanEstudioEditar());
			setCarreraEditar(carreraServ.obtenerCarrera(getCarreraElegida().getIdCarreraProf()));			
		}else
			{
			context.addMessage(null, new FacesMessage("No guardo", "Debe guardar la nueva carrera primero"));  
	        System.out.println("no existe carrera");
			}
	}
	public void editarPlanEstudioElegido(SelectEvent ev){
		setPlanEstudioEditar(planservice.obtenerPlanEstudio(getPlanesEstudioElegido().getIdPlanEstudio()));
	}
	
	
	public void nuevoPerAcad(ActionEvent ev){
		setPeriodoAcadxPlanEditar(new PlanEstPeriodoAcademicoDTO());
		getPeriodoAcadxPlanEditar().setIdPlanEstudio(getPlanEstudioEditar().getIdPlanEstudio());
	}
	public void editarPeriodoAcadxPlanElegido(SelectEvent ev){
		setPeriodoAcadxPlanEditar(perAcadPlanService.obtenerPeriodoAcadxPlan(getPeriodoAcadxPlanElegido().getIdPlanEstPerAcad()));
	}
	public void guardarPeriodoAcad(ActionEvent ev){
		FacesContext contexto=FacesContext.getCurrentInstance();
		if (getPeriodoAcadxPlanEditar().getIdPlanEstudio()!=null) {
			perAcadPlanService.guardarPeriodoAcademicoxPlan(getPeriodoAcadxPlanEditar());
			setPlanEstudioEditar(planservice.obtenerPlanEstudio(getPlanEstudioEditar().getIdPlanEstudio()));
		} else {
			contexto.addMessage(null, new FacesMessage("No guardo", "Debe guardar el nuevo plan de estudio primero"));  
	        System.out.println("no existe Plan de estudio");
		}	
	}
	
	
	public void nuevoCursoxPeriodo(ActionEvent ev){
		setCursoEditar(new CursoDTO());
		getCursoEditar().setIdPlanEstPeriodo(getPeriodoAcadxPlanEditar().getIdPlanEstPerAcad());
	}
	public void editarCursoxPeriodoElegido(SelectEvent ev){
		setCursoEditar(cursoService.obtenerCurso(getCursoElegido().getIdCurso()));
	}
	public void guardarCursoxPeriodo(ActionEvent ev){
		FacesContext contexto=FacesContext.getCurrentInstance();
		if (getCursoEditar().getIdPlanEstPeriodo()!=null) {
			cursoService.guardarCurso(getCursoEditar());
			setPeriodoAcadxPlanEditar(perAcadPlanService.obtenerPeriodoAcadxPlan(getPeriodoAcadxPlanEditar().getIdPlanEstPerAcad()));
		} else {
			contexto.addMessage(null, new FacesMessage("No guardo", "Debe guardar el nuevo periodo academico primero"));  
	        System.out.println("no existe Periodo Academico");
		}
	}
	

	public void nuevoAvancexSemana(ActionEvent ev){
		setSyllabusEditar(new SyllabusxSemanaDTO());
		getSyllabusEditar().setIdCurso(getCursoEditar().getIdCurso());
	}
	public void editarAvancexSemana(SelectEvent ev){
		setSyllabusEditar(syllabusService.obtenerSyllabus(getSyllabusElegido().getIdSyllabus()));
	}
	public void guardarAvancexSemana(ActionEvent ev){
		FacesContext contexto=FacesContext.getCurrentInstance();
		if (getSyllabusEditar().getIdCurso()!=null) {
			syllabusService.guardarSyllabus(getSyllabusEditar());
			setCursoEditar(cursoService.obtenerCurso(getCursoEditar().getIdCurso()));
		} else {
			contexto.addMessage(null, new FacesMessage("No guardo", "Debe guardar el nuevo periodo academico primero"));  
	        System.out.println("no existe Periodo Academico");
		}
	}
	/**************GETTERS AND SETTERS*********************/
	public List<CarreraProfesionalDTO> getListCarreras() {
		return listCarreras;
	}

	public void setListCarreras(List<CarreraProfesionalDTO> listCarreras) {
		this.listCarreras = listCarreras;
	}


	public CarreraProfesionalDTO getCarreraElegida() {
		return carreraElegida;
	}


	public void setCarreraElegida(CarreraProfesionalDTO carreraElegida) {
		this.carreraElegida = carreraElegida;
	}
	public Integer getIndiceTab() {
		return indiceTab;
	}
	public void setIndiceTab(Integer indiceTab) {
		this.indiceTab = indiceTab;
	}
	public CarreraProfesionalDTO getCarreraEditar() {
		return carreraEditar;
	}
	public void setCarreraEditar(CarreraProfesionalDTO carreraEditar) {
		this.carreraEditar = carreraEditar;
	}
	public PlanEstudioDTO getPlanEstudioEditar() {
		return planEstudioEditar;
	}
	public void setPlanEstudioEditar(PlanEstudioDTO planEstudioEditar) {
		this.planEstudioEditar = planEstudioEditar;
	}
	public PlanEstudioDTO getPlanesEstudioElegido() {
		return planesEstudioElegido;
	}
	public void setPlanesEstudioElegido(PlanEstudioDTO planesEstudioElegido) {
		this.planesEstudioElegido = planesEstudioElegido;
	}
	public PlanEstPeriodoAcademicoDTO getPeriodoAcadxPlanElegido() {
		return periodoAcadxPlanElegido;
	}
	public void setPeriodoAcadxPlanElegido(PlanEstPeriodoAcademicoDTO periodoAcadxPlanElegido) {
		this.periodoAcadxPlanElegido = periodoAcadxPlanElegido;
	}
	public PlanEstPeriodoAcademicoDTO getPeriodoAcadxPlanEditar() {
		return periodoAcadxPlanEditar;
	}
	public void setPeriodoAcadxPlanEditar(PlanEstPeriodoAcademicoDTO periodoAcadxPlanEditar) {
		this.periodoAcadxPlanEditar = periodoAcadxPlanEditar;
	}
	public CursoDTO getCursoElegido() {
		return cursoElegido;
	}
	public void setCursoElegido(CursoDTO cursoElegido) {
		this.cursoElegido = cursoElegido;
	}
	public CursoDTO getCursoEditar() {
		return cursoEditar;
	}
	public void setCursoEditar(CursoDTO cursoEditar) {
		this.cursoEditar = cursoEditar;
	}
	public SyllabusxSemanaDTO getSyllabusElegido() {
		return syllabusElegido;
	}
	public void setSyllabusElegido(SyllabusxSemanaDTO syllabusElegido) {
		this.syllabusElegido = syllabusElegido;
	}
	public SyllabusxSemanaDTO getSyllabusEditar() {
		return syllabusEditar;
	}
	public void setSyllabusEditar(SyllabusxSemanaDTO syllabusEditar) {
		this.syllabusEditar = syllabusEditar;
	}

}
